package com.example.demo.utils;


import org.joda.time.DateTime;
import org.joda.time.Months;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by HZY on 2018/1/14.
 */
public class DateUtils {

    public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static String getCurDataString() {
        return dateFormat.format(new Date());
    }


    /**
     * 通过身份证号码获取出生日期、性别、年龄
     * @param certificateNo
     * @return 返回的出生日期格式：1990-01-01   性别格式：F-女，M-男
     */
    public static Map<String, String> getBirAgeSex(String certificateNo) {
        String birthday = "";
        String age = "";
        String sexCode = "";

        int year = Calendar.getInstance().get(Calendar.YEAR);
        char[] number = certificateNo.toCharArray();
        boolean flag = true;
        if (number.length == 15) {
            for (int x = 0; x < number.length; x++) {
                if (!flag) return new HashMap<String, String>();
                flag = Character.isDigit(number[x]);
            }
        } else if (number.length == 18) {
            for (int x = 0; x < number.length - 1; x++) {
                if (!flag) return new HashMap<String, String>();
                flag = Character.isDigit(number[x]);
            }
        }
        if (flag && certificateNo.length() == 15) {
            birthday = "19" + certificateNo.substring(6, 8) + "-"
                    + certificateNo.substring(8, 10) + "-"
                    + certificateNo.substring(10, 12);
            sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 3, certificateNo.length())) % 2 == 0 ? "F" : "M";
            age = (year - Integer.parseInt("19" + certificateNo.substring(6, 8))) + "";
        } else if (flag && certificateNo.length() == 18) {
            birthday = certificateNo.substring(6, 10) + "-"
                    + certificateNo.substring(10, 12) + "-"
                    + certificateNo.substring(12, 14);
            sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 4, certificateNo.length() - 1)) % 2 == 0 ? "F" : "M";
            age = (year - Integer.parseInt(certificateNo.substring(6, 10))) + "";
        }
        Map<String, String> map = new HashMap<String, String>();
        map.put("birthday", birthday);
        map.put("age", age);
        map.put("sexCode", sexCode);
        return map;
    }


    /**
     * 比较当前日期和输入日期相差的天数
     * @param date
     * @throws ParseException
     */
    public static int  daysBetween( String date) {
        Date date2=new Date();
        Date date3=null;
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        try {
            date2=sdf.parse(sdf.format(date2));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            date3=    sdf.parse(sdf.format(sdf.parse(date)));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Calendar cal =Calendar.getInstance();
        cal.setTime(date2);
        long time1 = cal.getTimeInMillis();
        cal.setTime(date3);
        long time2 = cal.getTimeInMillis();
        long between_days=(time1-time2)/(1000*3600*24);
        return Integer.parseInt(String.valueOf(between_days));
    }

    /**获取当前时间格式如2017-08-12 08 23:59.212**/
    public static  String  Getdnowdatexx(){
        Date date1=new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String tablename=dateFormat.format(date1);
        return tablename;
    }

    /**
     * 获取时间格式如20180407
     * @return
     */
    public static String getStringToday(){
        Date currentTimeDate=new Date();
        SimpleDateFormat formater =new SimpleDateFormat("yyyMMdd");
        String dString=formater.format(currentTimeDate);
        return dString;
    }

    /**
     * 通过身份证号获取年龄
     * @param idCard
     * @return
     */
    public static int getAgeByIdCard(String idCard) {
        int iAge = 0;
        Calendar cal = Calendar.getInstance();
        String year = idCard.substring(6, 10);
        int iCurrYear = cal.get(Calendar.YEAR);
        iAge = iCurrYear - Integer.valueOf(year);
        return iAge;
    }

    /**转换时间格式如2017-08-12 08 00**/
    public static  String  converttimetoYYMMDDHH00(String date){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date1 = null;
        try {
            date1=sdf.parse(date);

        } catch (ParseException ex) {
            System.out.print("jycx"+"时间转换有错误");
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd 00:00.000");
        String tablename=dateFormat.format(date1);
        return tablename;
    }

    public static  String  converttimetoYYMMDD(String date){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD");
        Date date1 = null;
        try {
            date1=sdf.parse(date);

        } catch (ParseException ex) {
            System.out.print("jycx"+"时间转换有错误");
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-DD");
        String tablename=dateFormat.format(date1);
        return tablename;
    }

    /**
     * 判断输入时间是否等于当日
     * @param ghrq
     * @return
     */
    public static boolean  datesdiferrent(String ghrq) {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd ");
        Date date1 = null;
        Date date =new Date();
        try {
            date1=sdf.parse(ghrq);

        } catch (ParseException ex) {
            System.out.print("jycx"+"时间转换有错误");
        }
        String Bigdadate=sdf.format(date1);
        String nowdateString=sdf.format(date);
        boolean ok=false;
        if(Bigdadate.equals(nowdateString)){
            ok=true;
        }else{ok=false;}
        return ok;
    }
    /** 
  * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数 
  */public static String getNextDay(String nowdate, String delay) { 
 try{ 
 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 String mdate = ""; 
 Date d = strToDate(nowdate); 
 long myTime = (d.getTime() / 1000) + Integer.parseInt(delay) * 24 * 60 * 60; 
 d.setTime(myTime * 1000); 
 mdate = format.format(d); 
 return mdate; 
        }catch(Exception e){ 
 return ""; 
 } 
 } 
 
 /** 
* 将短时间格式字符串转换为时间 yyyy-MM-dd  
 *  
  * @param strDate 
 * @return 
 */
        public static Date strToDate(String strDate) {  
       SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       ParsePosition pos = new ParsePosition(0);  
       Date strtodate = formatter.parse(strDate, pos);  
       return strtodate;  
        }

    /**通过身份证号获取年龄的月数如20岁则输出为240
     * **/
    public  static  int getAgeMothByIdCard(String idCard){
        String birth = idCard.substring(6, 14);
        DateTimeFormatter format = DateTimeFormat.forPattern("yyyyMMdd");
        //时间解析
        DateTime birthday = DateTime.parse(birth, format);
        DateTime now = new DateTime();
        int month = Months.monthsBetween(birthday, now).getMonths();
        return month;
    }
    /***判断身份证号是否合法**/
//    public static boolean isIDNumber(String IDNumber) { if (IDNumber == null || "".equals(IDNumber)) { return false; } // 定义判别用户身份证号的正则表达式（15位或者18位，最后一位可以为字母）//
//        String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)"; //假设18位身份证号码:41000119910101123X 410001 19910101 123X //^开头 //[1-9] 第一位1-9中的一个 4 //\\d{5} 五位数字 10001（前六位省市县地区） //(18|19|20) 19（现阶段可能取值范围18xx-20xx年） //\\d{2} 91（年份） //((0[1-9])|(10|11|12)) 01（月份） //(([0-2][1-9])|10|20|30|31)01（日期） //\\d{3} 三位数字 123（第十七位奇数代表男，偶数代表女） //[0-9Xx] 0123456789Xx其中的一个 X（第十八位为校验值） //$结尾 //假设15位身份证号码:410001910101123 410001 910101 123 //^开头 //[1-9] 第一位1-9中的一个 4 //\\d{5} 五位数字 10001（前六位省市县地区） //\\d{2} 91（年份） //((0[1-9])|(10|11|12)) 01（月份） //(([0-2][1-9])|10|20|30|31)01（日期） //\\d{3} 三位数字 123（第十五位奇数代表男，偶数代表女），15位身份证不含X //$结尾
//        boolean matches = IDNumber.matches(regularExpression); //判断第18位校验值
//         if (matches) { if (IDNumber.length() == 18) { try { char[] charArray = IDNumber.toCharArray(); //前十七位加权因
//             int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; //这是除以11后，可能产生的11位余数对应的验证码
//              String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; int sum = 0; for (int i = 0; i < idCardWi.length; i++)
//              { int current = Integer.parseInt(String.valueOf(charArray[i])); int count = current * idCardWi[i]; sum += count; }
//              char idCardLast = charArray[17]; int idCardMod = sum % 11; if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) { return true; }
//              else { System.out.println("身份证最后一位:" + String.valueOf(idCardLast).toUpperCase() + "错误,正确的应该是:" + idCardY[idCardMod].toUpperCase()); return false; } } catch (Exception e) { e.printStackTrace();
//             System.out.println("异常:" + IDNumber); return false; } } } return matches; }

    public static boolean isIDNumber(String IDNumber) { if (IDNumber == null || "".equals(IDNumber)) { return false; } // 定义判别用户身份证号的正则表达式（15位或者18位，最后一位可以为字母）
        String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" + "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)"; //假设18位身份证号码:41000119910101123X 410001 19910101 123X //^开头 //[1-9] 第一位1-9中的一个 4 //\\d{5} 五位数字 10001（前六位省市县地区） //(18|19|20) 19（现阶段可能取值范围18xx-20xx年） //\\d{2} 91（年份） //((0[1-9])|(10|11|12)) 01（月份） //(([0-2][1-9])|10|20|30|31)01（日期） //\\d{3} 三位数字 123（第十七位奇数代表男，偶数代表女） //[0-9Xx] 0123456789Xx其中的一个 X（第十八位为校验值） //$结尾 //假设15位身份证号码:410001910101123 410001 910101 123 //^开头 //[1-9] 第一位1-9中的一个 4 //\\d{5} 五位数字 10001（前六位省市县地区） //\\d{2} 91（年份） //((0[1-9])|(10|11|12)) 01（月份） //(([0-2][1-9])|10|20|30|31)01（日期） //\\d{3} 三位数字 123（第十五位奇数代表男，偶数代表女），15位身份证不含X //$结尾
         boolean matches = IDNumber.matches(regularExpression); //判断第18位校验值
        if (matches) { if (IDNumber.length() == 18) { try { char[] charArray = IDNumber.toCharArray(); //前十七位加权因子
             int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; //这是除以11后，可能产生的11位余数对应的验证码
            String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"}; int sum = 0; for (int i = 0; i < idCardWi.length; i++) { int current = Integer.parseInt(String.valueOf(charArray[i])); int count = current * idCardWi[i]; sum += count; } char idCardLast = charArray[17]; int idCardMod = sum % 11; if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) { return true; } else { return false; } } catch (Exception e) { e.printStackTrace(); return false; } } } return matches; }
}
